<?php
/*
Plugin Name: Rudi Cliente
Plugin URI: http://wordpress.org
Description: Permite contectarse a rudi 
Version: 0.9.5.1
Author: Jcuello

/**
 * @file
 * Creates a PEAR XMLRPC2 Client object .
 */

/********************************
 *	1. Constantes e includes	*
 ********************************/

define('URL_RUDI_WS', 'http://192.168.100.32/index.php');
//define('URL_RUDI_WS', 'http://ws.iccknet.com/registro/index.php');
// Contingencia de RUDI (Descomentar para habilitar.  NOTA: comentar la anterior linea).
//define('URL_RUDI_WS', 'http://rudicont.icck.net/index.php');
define('XMLRPC2_ID_PORTAL', '8');

require('XML/RPC2/Client.php');

/********************************
 *	2. Funciones auxiliares		*
 ********************************/

function xmlrpc2_api_create_client($url) {

	$xmlrpc2_options = _xmlrpc2_api_options();
	$xmlrpc2_client = XML_RPC2_Client::create($url,$xmlrpc2_options);
	return $xmlrpc2_client;
}

function _xmlrpc2_api_options() {

	$xmlrpc2_options = array(
		'prefix' => 'reg.',
		'debug' => false,
	);

	return $xmlrpc2_options;
}

/**
 * Codifica una cadena de caracteres.
 *
 */
function _xmlrpc2_rudi_encode($plain_string)
{
	// concatenate the given string with the secret key
	$str = base64_encode($plain_string.'1cckn3t2008');
	// turn back into string and scramble with md5()
	return md5($str);
}

// Disable function with die
function disable_function() {
 die('No disponible.');
}

/********************************
 *	3. Plugin core / hooks		*
 ********************************/

/**
 * hook_init  -  Valida las cookies e inicia sesión.
 */

function initialize() {
	$current_user = wp_get_current_user();

	if(isset($_COOKIE["USUARIO"]) && empty($current_user->ID)) {
		if(_xmlrpc2_rudi_encode($_COOKIE["USUARIO"])==$_COOKIE["RSUIDUR"]) {
			//require_once('./wp-includes/registration.php');
			// Inicia el cliente RUDI.
			$cliente = xmlrpc2_api_create_client(URL_RUDI_WS);
			$usuario = utf8_encode($_COOKIE["USUARIO"]);
			$email_usuario = base64_decode($cliente->seleccionarEmailXAlias(base64_encode($usuario)));
			// Log user in, or register new user if not already present, login, set cookies.

			$user_bd = get_userdatabylogin($usuario);

			if (empty($user_bd)) {	// el usuario no existe.
				// Register new user.
				$userarray = Array();
				$userarray['user_login'] = $usuario;
				$userarray['user_pass'] = substr(md5(uniqid(microtime())), 0, 8);
				$userarray['first_name'] = utf8_decode($cliente->seleccionarNombre(base64_encode($email_usuario)));
				$userarray['last_name'] = utf8_decode($cliente->seleccionarApellido(base64_encode($email_usuario)));
				$userarray['user_email'] = $email_usuario;
				$userarray['display_name'] = $userarray['first_name'].' '.$userarray['last_name'];

				if (trim($userarray['display_name']) == "") {
					$userarray['display_name'] = $usuario;
				}

				$username = $usuario;
				wp_insert_user($userarray);
				$user_bd = get_userdatabylogin($usuario);
			}

			//login
			wp_set_current_user($user_bd->ID, $usuario);
			wp_set_auth_cookie($user_bd->ID);
			do_action('wp_login', $usuario);
		}
	}

	if(isset($_COOKIE["END_SESS_SUB"])) {
		$dominio = str_replace('blogs.','',$_SERVER["HTTP_HOST"]);
		$dominio = '.'.$dominio;
		$exp = time() - 31536000;
		setcookie('CC_LOGGED_IN', '', $exp, '/', $dominio);
		setcookie('USUARIO', '', $exp, '/', $dominio);
		setcookie('RSUIDUR', '', $exp, '/', $dominio);
		setcookie('END_SESS_SUB', '', $exp, '/', $dominio);
		wp_clear_auth_cookie();
		wp_safe_redirect('index.php');
	}
}

/**
 * hook_login.
 */
function _xmlrpc2_rudi_login($user_login) {
	$user_bd = get_userdatabylogin($user_login);

	if(!empty($user_bd->ID)) {
		// Inicia el cliente RUDI
		$cliente = xmlrpc2_api_create_client(URL_RUDI_WS);

		if($cliente->existeEmail(base64_encode($user_bd->user_email))) {
			$dominio = str_replace('blogs.','',$_SERVER["HTTP_HOST"]);
			$dominio = '.'.$dominio;
			$exp = time() + 43200;
			$username = utf8_decode($user_login);
			setcookie('USUARIO', $username, $exp,  '/', $dominio);
			setcookie('RSUIDUR', _xmlrpc2_rudi_encode($username), $exp, '/', $dominio);
			setcookie('CC_LOGGED_IN', 'Y', $exp, '/', $dominio);
		}
	}
}

/**
 * hook_logout.
 */
function _xmlrpc2_rudi_logout() {
	$dominio = str_replace('blogs.','',$_SERVER["HTTP_HOST"]);
	$dominio = '.'.$dominio;
	$exp = time() - 31536000;
	setcookie('USUARIO', '', $exp,  '/', $dominio);
	setcookie('RSUIDUR', '', $exp, '/', $dominio);
	$exp = time() + 43200;
	setcookie('END_SESS_MAIN', 'YES', $exp, '/', $dominio);
	setcookie('CC_LOGGED_IN', '', $exp, '/', $dominio);	// Instruccion innecesaria, solo para efectos de correccion del "Bug".
	wp_clear_auth_cookie();
	wp_safe_redirect('index.php');
}

/**
 * hook wp_authenticate  -  valida el usuario en RUDI.
 */
function _xmlrpc2_rudi_check_login($username,$password) {
	if(empty($username) || empty($password)) {	// NULL values.
		return;
	}
// Si entra aqui, significa que se va a utilizar este mecanismo de autenticación, antes que pregunte en wordpress.
	//require_once('./wp-includes/registration.php');
	$current_user = wp_get_current_user();

	if(!empty($current_user->ID)) {
		// Another module has already handled authentication, or it's the admin user.
		return;
	}

	$email = "";
	$estado = -1;
	$name = "";
	$login_test = "";
	// Inicia el cliente RUDI.
	$cliente = xmlrpc2_api_create_client(URL_RUDI_WS);

	if(strpos($username, '@') !== false) {	// email
		$email = $username;
	}
	else {	// username
		$email = base64_decode($cliente->seleccionarEmailXAlias(base64_encode($username)));
	}

	// Se evalúa el nombre de usuario (en este caso, el email).
	if(!empty($email)) {
		$estado = (int)$cliente->autenticar(base64_encode($email),md5($password));
		// Selecciona el alias dado para el portal.
		if($estado==1) {
			// Alias registrado en blogs.
			$login_test = $cliente->seleccionarAliasXPortal(base64_encode($email),(int)XMLRPC2_ID_PORTAL);

			if(empty($login_test)) {
				// Ahora busca el alias registrado en el espectador.
				$login_test = $cliente->seleccionarAliasXPortal(base64_encode($email),(int)"1");
				// dlc. Escoge el primer alias registrado por el usuario (cualquier portal).
				if(empty($login_test)) {
					$names = $cliente->seleccionarAliases(base64_encode($email));
					$login_test = utf8_decode($names[0]['alias']);
				}
			}
			if(is_array($login_test)) {
				$name = utf8_decode($login_test['alias']);
			}
			else {
				$name = $login_test;
			}
		}
	}

	if($estado==1) {	// Cuenta habilitada
		// Register new user if not already present.
		$userarray = Array();
		$userarray['user_login'] = $name;
		$userarray['user_pass'] = $password;
		$userarray['first_name'] = utf8_decode($cliente->seleccionarNombre(base64_encode($email)));
		$userarray['last_name'] = utf8_decode($cliente->seleccionarApellido(base64_encode($email)));
		$userarray['user_email'] = $email;
		$userarray['display_name'] = $userarray['first_name'].' '.$userarray['last_name'];

		if (trim($userarray['display_name']) == "") {
			$userarray['display_name'] = $name;
		}

		if ($id = username_exists($name)) {	//just do an update.
			$userarray['ID'] = $id;
			$username = $name;
			wp_update_user($userarray);
		}
		else {	// insert the new user.
			$username = $name;
			wp_insert_user($userarray);
		}
	}
	else {
		// VOID.
		// Usuario no valido, procede a la autenticación local, no hace nada.
	}
}


function omniture_tags_rudi(){
	$current_user = wp_get_current_user();
	
		if(isset($_COOKIE["USUARIO"]) && !empty($current_user->ID)) {
		
			if(_xmlrpc2_rudi_encode($_COOKIE["USUARIO"])==$_COOKIE["RSUIDUR"]) {
				//require_once('./wp-includes/registration.php');
				// Inicia el cliente RUDI.
				$cliente = xmlrpc2_api_create_client(URL_RUDI_WS);
				$usuario = utf8_encode($_COOKIE["USUARIO"]);
				$email_usuario = base64_decode($cliente->seleccionarEmailXAlias(base64_encode($usuario)));
								
				// Log user in, or register new user if not already present, login, set cookies.
			
				$userarray = Array();
				$userarray['user_login'] = $usuario;
				$userarray['fecha_user'] = utf8_decode($cliente->seleccionarFechaNacimiento(base64_encode($email_usuario)));
				$userarray['genero_user'] = utf8_decode($cliente->seleccionarGenero(base64_encode($email_usuario)));
				$userarray['pais_user'] = ($cliente->seleccionarPais(base64_encode($email_usuario)));
				$userarray['depto_user'] = ($cliente->seleccionarDepartamento(base64_encode($email_usuario)));
				$userarray['ciudad_user'] = ($cliente->seleccionarCiudad (base64_encode($email_usuario)));
				$userarray['ocupacion_user'] = ($cliente->seleccionarOcupacion(base64_encode($email_usuario)));				
			}
		}
		
	return $userarray;
}

// Register actions
add_action('wp_login', '_xmlrpc2_rudi_login');
add_action('wp_logout', '_xmlrpc2_rudi_logout');
add_action('wp_authenticate', '_xmlrpc2_rudi_check_login',1,2);
add_action('init', 'initialize');
// Disable some functions
add_action('lost_password', 'disable_function');
add_action('retrieve_password', 'disable_function');
add_action('password_reset', 'disable_function');

?>
